package interpreter

import (
	"fmt"
	"runtime"
	"strconv"
	"strings"
)

func (e *Evaluator) registerConsole() {

	// 初始化控制台对象
	consoleObj := &Hash{Pairs: make(map[HashKey]HashPair)}

	// 将console方法注册到console对象
	for name, fn := range map[string]BuiltinFunction{
		"log": func(args ...Object) Object {
			for i, arg := range args {
				if i == 0 {
					continue
				}

				// 处理字符串中的转义序列
				if s, ok := arg.(*String); ok {
					// 先尝试使用strconv.Unquote解析转义字符
					// 需要先添加引号使其成为合法的Go字符串字面量
					unquoted, err := strconv.Unquote(`"` + strings.Replace(s.Value, `"`, `\"`, -1) + `"`)
					if err == nil {
						fmt.Print(unquoted)
					} else {
						// 如果解析失败，输出原始字符串
						fmt.Print(s.Value)
					}
				} else {
					fmt.Print(arg.Inspect())
				}

				if i < len(args)-1 {
					fmt.Print(" ")
				}
			}
			fmt.Println()
			return UNDEFINED
		},
		"error": func(args ...Object) Object {
			fmt.Print("\033[31m") // 红色文本
			for i, arg := range args {
				if i == 0 {
					continue
				}

				// 处理字符串中的转义序列
				if s, ok := arg.(*String); ok {
					unquoted, err := strconv.Unquote(`"` + strings.Replace(s.Value, `"`, `\"`, -1) + `"`)
					if err == nil {
						fmt.Print(unquoted)
					} else {
						fmt.Print(s.Value)
					}
				} else {
					fmt.Print(arg.Inspect())
				}

				if i < len(args)-1 {
					fmt.Print(" ")
				}
			}
			fmt.Println("\033[0m") // 重置颜色
			return UNDEFINED
		},
		"warn": func(args ...Object) Object {
			fmt.Print("\033[33m") // 黄色文本
			for i, arg := range args {
				if i == 0 {
					continue
				}

				// 处理字符串中的转义序列
				if s, ok := arg.(*String); ok {
					unquoted, err := strconv.Unquote(`"` + strings.Replace(s.Value, `"`, `\"`, -1) + `"`)
					if err == nil {
						fmt.Print(unquoted)
					} else {
						fmt.Print(s.Value)
					}
				} else {
					fmt.Print(arg.Inspect())
				}

				if i < len(args)-1 {
					fmt.Print(" ")
				}
			}
			fmt.Println("\033[0m") // 重置颜色
			return UNDEFINED
		},
		"info": func(args ...Object) Object {
			fmt.Print("\033[36m") // 青色文本
			for i, arg := range args {
				if i == 0 {
					continue
				}

				// 处理字符串中的转义序列
				if s, ok := arg.(*String); ok {
					unquoted, err := strconv.Unquote(`"` + strings.Replace(s.Value, `"`, `\"`, -1) + `"`)
					if err == nil {
						fmt.Print(unquoted)
					} else {
						fmt.Print(s.Value)
					}
				} else {
					fmt.Print(arg.Inspect())
				}

				if i < len(args)-1 {
					fmt.Print(" ")
				}
			}
			fmt.Println("\033[0m") // 重置颜色
			return UNDEFINED
		},
		"debug": func(args ...Object) Object {
			fmt.Print("\033[90m") // 灰色文本
			for i, arg := range args {
				if i == 0 {
					continue
				}

				// 处理字符串中的转义序列
				if s, ok := arg.(*String); ok {
					unquoted, err := strconv.Unquote(`"` + strings.Replace(s.Value, `"`, `\"`, -1) + `"`)
					if err == nil {
						fmt.Print(unquoted)
					} else {
						fmt.Print(s.Value)
					}
				} else {
					fmt.Print(arg.Inspect())
				}

				if i < len(args)-1 {
					fmt.Print(" ")
				}
			}
			fmt.Println("\033[0m") // 重置颜色
			return UNDEFINED
		},
		"trace": func(args ...Object) Object {
			fmt.Println("\033[36mStack Trace:\033[0m")
			buf := make([]byte, 4096)
			n := runtime.Stack(buf, false)
			fmt.Println(string(buf[:n]))
			return UNDEFINED
		},
	} {
		strKey := &String{Value: name}
		consoleObj.Pairs[strKey.HashKey()] = HashPair{Key: strKey, Value: &Builtin{Fn: fn}}
	}

	e.env.Set("console", consoleObj)
}

func warn(str string, args ...any) {
	fmt.Print("\033[33m") // 黄色文本
	fmt.Printf(str, args...)
	fmt.Println("\033[0m") // 重置颜色
}
